package cn.miju.wechatpay.response;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder;

import java.io.Serializable;

/**
 * <pre>
 * 业务类
 * </pre>
 *
 * @author Huzb
 * @version 1.0.0
 * @since 2023年05月22日 14:37
 */
@Data
@SuperBuilder
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
public class WechatpayRefundOrderResp extends WechatpayBaseResp {
    private static final long serialVersionUID = 1L;

    /**
     * 微信支付退款单号
     */
    private String refundId;

    /**
     * 商户退款单号
     */
    private String outRefundNo;

    /**
     * 微信支付订单号
     */
    private String transactionId;

    /**
     * 商户订单号
     */
    private String outTradeNo;

    /**
     * 退款渠道
     * <p>
     * ORIGINAL：原路退款
     * BALANCE：退回到余额
     * OTHER_BALANCE：原账户异常退到其他余额账户
     * OTHER_BANKCARD：原银行卡异常退到其他银行卡
     */
    private String channel;

    /**
     * 退款入账账户
     * 取当前退款单的退款入账方，有以下几种情况：
     * 1）退回银行卡：{银行名称}{卡类型}{卡尾号}
     * 2）退回支付用户零钱:支付用户零钱
     * 3）退还商户:商户基本账户商户结算银行账户
     * 4）退回支付用户零钱通:支付用户零钱通
     */
    private String userReceivedAccount;

    /**
     * 退款成功时间
     * 当退款状态为退款成功时有返回。
     * 示例值：2020-12-01T16:18:12+08:00
     */
    private String successTime;

    /**
     * 退款创建时间（退款受理时间）
     * 示例值：2020-12-01T16:18:12+08:00
     */
    private String createTime;

    /**
     * 退款状态
     * 枚举值：
     * SUCCESS：退款成功
     * CLOSED：退款关闭
     * PROCESSING：退款处理中
     * ABNORMAL：退款异常
     */
    private String status;

    /**
     * 资金账户
     * 枚举值：
     * UNSETTLED : 未结算资金
     * AVAILABLE : 可用余额
     * UNAVAILABLE : 不可用余额
     * OPERATION : 运营户
     * BASIC : 基本账户（含可用余额和不可用余额）
     */
    private String fundsAccount;


    @Data
    @Accessors(chain = true)
    public static class Amount implements Serializable {
        private static final long serialVersionUID = 1L;

        /**
         * 订单金额，单位为分
         */
        private Integer total;

        /**
         * 退款金额
         */
        private Integer refund;

        /**
         * 用户支付金额
         * 现金支付金额，单位为分，只能为整数
         */
        private Integer payerTotal;

        /**
         * 用户退款金额
         * 退款给用户的金额，不包含所有优惠券金额
         */
        private Integer payerRefund;

        /**
         * 应结退款金额
         * 去掉非充值代金券退款金额后的退款金额，单位为分，退款金额=申请退款金额-非充值代金券退款金额，退款金额<=申请退款金额
         */
        private Integer settlementRefund;

        /**
         * 应结订单金额
         * 应结订单金额=订单金额-免充值代金券金额，应结订单金额<=订单金额，单位为分
         */
        private Integer settlementTotal;

        /**
         * 优惠退款金额
         * 优惠退款金额<=退款金额，退款金额-代金券或立减优惠退款金额为现金，说明详见代金券或立减优惠，单位为分
         */
        private Integer discountRefund;

        /**
         * 退款币种 CNY
         */
        private String currency;

        /**
         * 手续费退款金额
         */
        private Integer refundFee;

    }
}
